package com.navinfo.platform.trip.common.arithmetic.data;

import com.navinfo.platform.trip.common.arithmetic.*;
import lombok.Data;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

/**
 * 算法链的公共数据，所有车厂的全量字段
 * @author: web
 */
@Data
public class CommonData implements Serializable {
    /**
     * 车辆id(公共)
     */
    private Long tid;
    /**
     * gps时间，单位毫秒 （公共）
     */
    private long gpsTime;
    /**
     * 上个点的gps时间，单位毫秒 （公共）
     * 第一个点为0
     **/
    private long lastGpsTime;
    /**
     * 速度,单位m/s (公共)
     */
    private BigDecimal speedMs;
    /**
     * 上个点的速度,单位m/s (公共)
     * 第一个点为null
     */
    private BigDecimal lastSpeedMs;
    /**
     * 速度,单位km/h (公共)
     */
    private int speedKmh;
    /**
     * 纬度 ，单位：以度为单位乘以10的6次方(公共)
     */
    private int latitude;
    /**
     * 经度 ，单位：以度为单位乘以10的6次方(公共)
     */
    private int longitude;
    /**
     * 原始纬度（84坐标系） ，单位：以度为单位乘以10的6次方(公共)
     */
    private int originalLat;
    /**
     * 原始经度（84坐标系） ，单位：以度为单位乘以10的6次方(公共)
     */
    private int originalLng;
    /**
     * 高程，海拔高度，单位米 (公共)
     */
    private int height;
    /**
     * 转速，单位：rpm（转每分钟）(公共)
     */
    private int rotation;
    /**
     * 上个点的发动机转速，单位：rpm （公共）
     */
    private int lastRotation;
    /**
     * 方向0-359正北为0顺时针(公共)
     */
    private int gpsDirection;
    /**
     * 上个点的方向(公共)
     */
    private int lastGpsDirection;
    /**
     * 离合器开关状态(公共)
     */
    private boolean clutchSwitch;
    /**
     * 发动机输出扭矩，单位：%(公共)
     */
    private int engineOutputTorque;
    /**
     * 油门开度，单位：%(公共)
     */
    private double acceleratorPosition;
    /**
     * 发动机燃油消耗率,单位：L/h(公共)
     */
    private BigDecimal fuelConsumptionRate;
    /**
     * 发动机瞬时油耗，单位：km/L(公共，目前无使用)
     */
    private BigDecimal realTimeOilConsumption;


    /* ********************************************
     * 0f37特有的指标，基础类型修饰无值使用默认值，封装类型修饰能确定是否有值
     *********************************************/
    /**
     * 制动信号(来自0F37，无值为0)
     */
    private boolean brake;
    /**
     * 大气温度(来自0F37，无值为null)
     */
    private Integer atmosphericTem;


    /* *************************************
    * 0200特有的指标，基础类型修饰无值使用默认值，封装类型修饰能确定是否有值
    **********************************/
    /**
     * ACC标志(0200特有，无值为false)
     */
    private boolean acc;
    /**
     * 弯道超速报警标志(0200特有)
     */
    private boolean curve;
    /**
     * 定速巡航标志(0200特有，无值为false)
     */
    private boolean cruiseControl;
    /**
     * 手刹标志(0200特有)
     */
    private boolean handBrake;
    /**
     * 急转弯标志(0200特有)
     */
    private boolean sharpTurning;
    /**
     * 空挡滑行标志(0200特有)
     */
    private boolean slideNeutral;
    /**
     * 急加速标志(0200特有)
     */
    private boolean rapidAcceleration;
    /**
     * 急减速标志(0200特有)
     */
    private boolean rapidDeceleration;
    /**
     * 猛踩油门报警标志(0200特有)
     */
    private boolean slamTheAccelerator;

    /**
     * 熄火滑行标志(0200特有),
     * 由于需要根据连续个数判断，所有需要存为list
     */
    private List<Boolean> coastFlameouts = new ArrayList<>();

    /**
     * 燃油消耗总量，单位升(0200特有，无值为null)
     */
    private Double totalOil;
    /**
     * 油液百分比(0200特有，无值为null)
     */
    private Double oilPercentage;
    /**
     * 水温(0200特有，无值为null)
     */
    private Integer waterTemp;
    /**
     * 进气温度(0200特有，无值为null)
     */
    private Integer intakeAirTem;
    /**
     * 进气压力(0200特有，无值为null)
     */
    private Integer intakePressure;
    /**
     * AMT载重，单位kg(0200特有，无值为null)
     */
    private Integer amtLoad;
    /**
     * VECU载重，单位kg(0200特有，无值为null)
     */
    private Integer vecuLoad;


    /* ***************************
    * 遍历位置点设置的指标
    ***************************/
    /**
     * 是否是行程第一个点
     */
    private boolean tripFirstNode;
    /**
     * 是否是行程最后一个点
     */
    private boolean tripLastNode;


    /* *********************************
     * 通过位置点计算的指标
     *********************************/
    /**
     * 与上一个报文时间差，单位毫秒 (公共)
     */
    private int dffTime;
    /**
     * 加速度,单位：米/平方秒 (公共)
     */
    private double acceleration;


    /* **************************
     *  算法设置的指标
     ***************************/
    /**
     * 与上一个报文之间油耗，单位毫升<br/>
     * （{@link Mileage}算法计算而来）
     */
    private double dffFuel;
    /**
     * 与上一个报文距离差,单位米<br/>
     * （{@link Mileage}算法计算而来）
     */
    private double dffMileage;

    /**
     * 行程内的积分里程 单位:M<br/>
     * （{@link Mileage}算法计算而来）
     */
    private double integralMileage;
    /**
     * 行程内的积分油耗 单位:ML<br/>
     * （{@link Mileage}算法计算而来）
     */
    private double integralFuel;
    /**
     * 行程内的积分时长，单位:S<br/>
     * （{@link Mileage}算法计算而来）
     */
    private double integralDuration;

    /**
     * 档位({@link Gear}算法计算而来)
     */
    private int gear;
    /**
     * 坡度（{@link DrivingSlope}计算而来）
     */
    private double slope;
    /**
     * 行程的累加刹车次数（{@link Brake}算法计算而来）
     */
    private int brakeNumber;
    /**
     * 当前点是否为ECO经济驾驶状态（{@link DrivingEco}ECO经济驾驶算法设置此值）
     */
    private boolean ecoDriving;
    /**
     * 当前点是否为停车怠速状态（{@link IdleParking}怠速算法设置此值）
     */
    private boolean parkingIdle;
    /**
     * 当前点是否为工作状态（非怠速）
     */
    public boolean isWork() {
        return !parkingIdle;
    }

    public void addCoastFlameout(Boolean status){
        this.coastFlameouts.add(status);
    }

    /**
     * 清空公共缓存数据（保留0200特有的数据）
     */
    public void clear() {
        //位置点设置的指标
        this.tid = null;
        this.gpsTime=0;
        this.lastGpsTime=0;
        this.speedKmh=0;
        this.speedMs=null;
        this.lastSpeedMs=null;
        this.latitude=0;
        this.longitude=0;
        this.originalLat=0;
        this.originalLng=0;
        this.height=0;
        this.gpsDirection=0;
        this.lastGpsDirection=0;
        this.engineOutputTorque=0;
        this.rotation=0;
        this.lastRotation=0;
        this.acceleratorPosition =0;
        this.clutchSwitch=false;
        this.realTimeOilConsumption=null;
        this.fuelConsumptionRate=null;

        //0f37特有数据
        this.brake=false;
        this.atmosphericTem = null;


        //遍历位置点设置的指标
        this.tripLastNode=false;
        this.tripFirstNode=false;

        //通过位置点计算的指标
        this.dffTime=0;
        this.acceleration =0.0;

        //通过算法计算的指标
        this.gear=0;
        this.slope=0;
        this.dffFuel =0;
        this.dffMileage =0;
        this.brakeNumber=0;
        this.integralMileage=0;
        this.integralFuel=0;
        this.integralDuration =0;
        this.ecoDriving=false;
        this.parkingIdle=false;

        //0200的指标不用清理，除了熄火滑行状态
        this.coastFlameouts.clear();
    }
}
